<?php

namespace app\common\controller;

use plugin\admin\app\controller\Crud;
use support\exception\ValidationException;
use support\facade\Logger;

class BaseController extends Crud
{

    /**
     * 快捷输入并验证（ 支持 规则 # 别名 ）
     * @param array $rules  验证规则（ 验证信息数组 ）
     * @param $type 输入方式 ( post 或 get )
     * @param callable|null $callable 异常处理操作
     * @return array
     * @throws ValidationException
     */
    protected function _vali(array $rules,$type='',?callable $callable = null):array
    {
        if($type == 'post'){
            $inputData  = request()->post();
        }else if($type == 'get'){
            $inputData = request()->get();
        }else {
            $inputData = request()->all();
        }
        $checkRules = [];// 提取所有的验证规则
        $chackMessage = [];// 提取所有的错误信息
        $fieldData = [];// 所有验证的字段
        foreach ($rules as $ruleKey=>$ruleValue){
            if(strpos($ruleKey,'._'))$ruleKey = str_replace('._','.require',$ruleKey);
            list($field,$rule) = explode('.',$ruleKey,2);
            // 规则值可能存在参数
            if (strpos($rule, ':') !== false) {
                // 规则中包含自定义错误信息，例如 'require:名称不能为空!'
                list($validateRule, $validateParams) = explode(':', $rule, 2);
            } else {
                // 没有指定错误信息，使用默认的规则错误信息
                $validateRule = $rule;
                $validateParams = ''; // 或者你可以设置一个默认的错误信息
            }
            // 如果规则值是一个默认值，并且不是验证规则（如 'value'），则添加字段默认值
            if ($validateRule === 'value' || !$rule) {
                $inputData[$field] = $inputData[$field]?:$ruleValue;
            }else{
                // 添加验证规则
                if (!empty($validateParams)) {
                    $checkRules[$field][] = $validateRule.':'.$validateParams;
                } else {
                    $checkRules[$field][] = $validateRule;
                }
                if($ruleValue){
                    list($messageKey,$_) = explode(':', $ruleKey, 2);
                    $chackMessage[$messageKey] = $ruleValue;
                }
            }
            $fieldData[$field] = 1;
        }
        foreach ($checkRules as $field=>$rules){
            $checkRules[$field] = join('|',$rules);
        }
        $validate = new \think\Validate;
        // 执行验证
        if(!$validate->rule($checkRules)->message($chackMessage)
            ->check($inputData)){
            if($callable){
                $callable($validate->getError());
            }else{
                throw new ValidationException($validate->getError()?:'');
            }
        }
        return array_intersect_key($inputData,$fieldData);
    }

}